<?php
/**
 * system library
 */
class Func
{
    function dataImg($file)
    {
        $imgFile = @file_get_contents($file);

        if (!$imgFile) {
            return null;
        }

        return base64_encode($imgFile);
    }

    /**
     * 输出信息,用于判断后输出提示信息
     * @param  array $infoData
     *  array(
     *   'stateCode' => $stateCode,  状态码 失败 400 成功 200 未知 404
     *   'message'   => $message,    (错误/成功)提示信息
     *   'data'      => $data        若需要，返回数据
     *   'referer'   => $referer     (发生错误后)回退地址
     *   'target'    => $target      (提示[成功]信息后)跳转地址
     *   );
     *  注：用于错误提示信息时('message'=> $message)
     *  1. 开启APP_DEBUG时，输出原样的$message,并且附带有跟踪信息.
     *  2. 关闭APP_DEBUG时，默认输出 @internal $defaultMsg;
     *    但当$msg含有字符 show: 时，则仍会输出$message.
     * @param  boolean|null $outJson 是否输出json格式数据，若不设置，当请求是Ajax时，默认返回 json 格式数据
     * @return void [type]            [description]
     */
    static public function tips(array $infoData,$outJson=NULL)
    {

        $isAjaxRequest    = isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']==='XMLHttpRequest';

        # 无key值，按默认顺序 'stateCode','message','data','referer'
        if (isset($infoData[0])) {
            $stateCode    = $infoData[0];
            $message      = isset($infoData[1]) ? $infoData[1] : '';
            $data         = isset($infoData[2]) ? $infoData[2] : '';
            $infoData     = [
                'stateCode'   => $stateCode ,
                'message'     => $message,
                'data'        => $data,
                'referer'     => isset($infoData[3]) ? $infoData[3] : '',
                'target'      => isset($infoData[4]) ? $infoData[4] : ''
            ];
        }

        $outJson==NULL && $outJson = $isAjaxRequest ? TRUE:FALSE;

        if ($outJson) {
            self::quit(json_encode($infoData));
        }

        $urlReferer = isset($_SERVER['HTTP_REFERER'])?$_SERVER['HTTP_REFERER'] : '/';

        @extract($infoData);

        !empty($referer) && $urlReferer = $referer;

        # error info
        if ($stateCode == 0) {

            # APP_DEBUG==true 带有跟踪信息.
            if (APP_DEBUG) {
                $debug_trace = debug_backtrace();
                $errorFile   = $debug_trace[0]['file'] =='' ? 'Unknown' : $debug_trace[0]['file'];
                $errorLine   = $debug_trace[0]['line'] =='' ? 'Unknown' : $debug_trace[0]['line'];
                $errorClass  = empty($debug_trace[1]['class']) ? '' : $debug_trace[1]['class'].'::';
                $errorFunc   = $debug_trace[1]['function'] =='' ? 'Unknown' : $debug_trace[1]['function'].'()';
                $message     = strpos($message,'show:')!==false ? str_replace('show:', '', $message) : $message;
                $outMsg      = <<<EOF
  <div style="margin:80px auto; width:800px;height:180px;font-family: Menlo, Monaco, Consolas, monospace;">
  <p style="line-height:1.4;">
  <span style="color:#888;">错误　信息：</span><strong>$message </strong> <br>
  <span style="color:#888;">所在的文件：</span>$errorFile <br>
  <span style="color:#888;">错误报告行：</span>第 <strong>$errorLine </strong>行<br>
  <span style="color:#888;">函数(方法)：</span>$errorClass$errorFunc <br>
  <p><a href="$urlReferer"> 返 回 </a></div>
EOF;
            }
            else {
                // var_dump(strpos($message,'show:')!==false, $message);
                $defaultMsg= '发生错误啦！请重试或报告问题。';
                $message   = strpos($message,'show:')!==false ? str_replace('show:', '', $message) : $defaultMsg;
                $outMsg    =  <<<EOF
<h2 style="margin:100px auto; width:800px;text-align:center;">
<br><span style="font-size:40px;">:( </span>. $message
<p><a href="$urlReferer" style="font-size:14px;"> 返 回 </a></p></h2>
<script>setTimeout(function(){window.location='$urlReferer'},2100);</script>
EOF;
            }

            self::quit($outMsg);
        }
    }

    static public function quit($msg=null)
    {
        exit($msg);
    }

}